from flask import Flask, render_template
import pandas as pd
import os

app = Flask(__name__)
# 修正数据路径（根据实际路径调整）
DATA_PATH = os.path.join(os.path.dirname(__file__), 'data')

def load_data():
    # 支付数据
    pay = pd.read_csv(os.path.join(DATA_PATH, 'payment_preference.csv'),
                      header=None, names=['method', 'count', 'amount'])
    # 销售数据
    sales = pd.read_csv(os.path.join(DATA_PATH, 'sales_date.csv'))
    sales['date'] = pd.to_datetime(sales[['Year', 'Month', 'Day']])
    sales['quarter'] = sales['date'].dt.to_period('Q')
    quarterly = sales.groupby('quarter')['Count'].sum()

    # 用户数据
    demo = pd.read_csv(os.path.join(DATA_PATH, 'user_demographics_purchase.csv'),
                       header=None, names=['gender', 'age_group', 'count', 'amount'])

    # 品类数据
    cat = pd.read_csv(os.path.join(DATA_PATH, 'user_preferred_categories.csv'),
                      header=None, names=['gender', 'age_group', 'category', 'count'])

    # 模型数据
    def load_feature_importance(filepath):
        df = pd.read_csv(filepath, header=None, names=['feature', 'importance'])
        df['importance'] = pd.to_numeric(df['importance'], errors='coerce')
        df = df.dropna()
        return dict(zip(df['feature'], df['importance']))

    # 图表配置（包含导航信息和说明）
    chart_config = [
        {
            'id': 'trendChart',
            'title': '每季度销量',
            'category': '销售分析',
            'description': '展示各季度销量变化趋势，可直观观察业务增长周期规律。数据显示Q3季度通常为销售旺季，可能与季节性促销活动相关。'
        },
        {
            'id': 'categoryChart',
            'title': '热门品类销量',
            'category': '品类分析',
            'description': '按销量排序的品类分布，Clothing品类销量领先，其次是Cosmetics和Food & Beverage，反映用户核心消费偏好。'
        },
        {
            'id': 'payChart',
            'title': '支付方式金额占比',
            'category': '支付分析',
            'description': '不同支付方式的交易金额占比，Card支付占比最高，其次是Alipay，反映用户支付习惯偏好。'
        },
        {
            'id': 'demoChart',
            'title': '用户画像',
            'category': '用户分析',
            'description': '按年龄和性别划分的用户分布，30-49岁女性用户占比最高，是平台核心用户群体。'
        },
        {
            'id': 'heatChart',
            'title': '性别×年龄×品类热力',
            'category': '用户分析',
            'description': '三维交叉分析用户对品类的偏好，30-49岁女性对Clothing的偏好度最高，50+男性更倾向于Food & Beverage。'
        },
        {
            'id': 'catAvgChart',
            'title': '品类销售额 TOP10',
            'category': '品类分析',
            'description': '按销售额排序的TOP10品类，Clothing和Cosmetics贡献主要营收，Technology品类客单价最高。'
        },
        {
            'id': 'avgPriceChart',
            'title': '支付方式平均客单价',
            'category': '支付分析',
            'description': '不同支付方式的平均客单价对比，Card支付客单价显著高于其他方式，可能与高端商品购买场景相关。'
        },
        {
            'id': 'predictionChart',
            'title': '模型销量预测对比',
            'category': '模型分析',
            'description': '三种机器学习模型（XGBoost、随机森林、GBR）的预测效果对比，XGBoost预测精度最高（RMSE=5.07）。'
        },
        {
            'id': 'featureImportanceChart',
            'title': '特征重要性分析',
            'category': '模型分析',
            'description': '影响销量预测的关键特征，diff_1（当日与前一日销量差）和rolling_min_3（3日滚动最小值）为主要影响因素。'
        },
        {
            'id': 'segmentPredictionChart',
            'title': '细分市场预测分析',
            'category': '模型分析',
            'description': '按性别、年龄和品类划分的细分市场预测，50+男性对Food & Beverage的需求预测准确率最高。'
        }
    ]

    return {
        # 基础数据
        'trend_labels': quarterly.index.astype(str).tolist(),
        'trend_values': quarterly.values.tolist(),
        'cat_labels': cat.groupby('category')['count'].sum().sort_values(ascending=False).index.tolist(),
        'cat_values': cat.groupby('category')['count'].sum().sort_values(ascending=False).values.tolist(),
        'pay_labels': pay['method'].tolist(),
        'pay_values': pay['count'].tolist(),
        'pay_amount': pay['amount'].tolist(),
        'age_groups': demo.pivot_table(index='age_group', columns='gender', values='count', aggfunc='sum').index.tolist(),
        'female_counts': demo.pivot_table(index='age_group', columns='gender', values='count', aggfunc='sum')['Female'].tolist() if 'Female' in demo else [],
        'male_counts': demo.pivot_table(index='age_group', columns='gender', values='count', aggfunc='sum')['Male'].tolist() if 'Male' in demo else [],
        'cat_amount_labels': cat.groupby('category')['count'].sum().sort_values(ascending=False).head(10).index.tolist(),
        'cat_amount_values': (cat.groupby('category')['count'].sum() * (pay['amount'].sum() / pay['count'].sum())).sort_values(ascending=False).head(10).values.tolist(),
        'heatmap_data': cat.to_dict('records'),
        # 模型数据
        'feature_importance': {
            'xgb': load_feature_importance(os.path.join(DATA_PATH, 'xgb_feature_importance.csv')),
            'rf': load_feature_importance(os.path.join(DATA_PATH, 'rf_feature_importance.csv')),
            'gbr': load_feature_importance(os.path.join(DATA_PATH, 'gbr_feature_importance.csv'))
        },
        'predictions': pd.read_csv(os.path.join(DATA_PATH, 'combined_predictions.csv')).to_dict('records'),
        'metrics': pd.read_csv(os.path.join(DATA_PATH, 'model_performance_summary.csv')).to_dict('records'),
        'segment_predictions': pd.read_csv(os.path.join(DATA_PATH, 'poisson_regression_predictions.csv')).to_dict('records'),
        # 导航配置
        'chart_config': chart_config
    }

# 支持默认页面和指定图表页面
@app.route('/')
@app.route('/chart/<chart_id>')
def dashboard(chart_id='trendChart'):
    data = load_data()
    # 获取当前图表信息
    current_chart = next((c for c in data['chart_config'] if c['id'] == chart_id), data['chart_config'][0])
    return render_template('dashboard.html',
                          current_chart=current_chart,
                          **data)

if __name__ == '__main__':
    app.run(debug=True)